package q714_maxProfit;

public class Solution {
    public static void main(String[] args) {
        Solution s = new Solution();
        s.maxProfit(new int[] {
            1,2,3,4,5,6,7,8
        }, 2);
    }
    /*
    我们用 buy 表示在最大化收益的前提下，如果我们手上拥有一支股票，那么它的最低买入价格是多少。
    在初始时，buy 的值为 prices[0] 加上手续费 fee。那么当我们遍历到第 i(i>0) 天时
    1 如果当前价格加上手续费小于buy 那么我们不如在这一天买入 以求更低的成本 所以要更新buy
    2 如果当前价格大于buy 也就是已经大于买入时股价和手续费了 我们就直接卖出股票
    但是此时面临一个问题 如果遇到第二天股票继续上涨等情况 或者小跌然后高涨 此时再买一次股票必然是亏损的
    因此我们可以提供一个反悔操作，看成当前手上拥有一支买入价格为 prices[i] 的股票
    将 buy 更新为 prices[i]。
    这样一来，如果下一天股票价格继续上升，我们会获得 prices[i+1] − prices[i] 的收益
    再加上这一天price - buy的收益 实际上恰好就等于在这一天不进行任何操作，而在下一天卖出股票的收益

    总结 即当我们卖出一支股票时，我们就立即获得了以相同价格并且免除手续费买入一支股票的权利
     */
    public int maxProfit(int[] prices, int fee) {
        int n = prices.length;
        int buy = prices[0] + fee;
        int profit = 0;
        for (int i = 1; i < n; ++i) {
            if (prices[i] + fee < buy) {
                buy = prices[i] + fee;
            } else if (prices[i] > buy) {
                profit += prices[i] - buy;
                buy = prices[i];
            }
        }
        return profit;

    }
}
